package com.company.app.services;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import com.company.app.constants.*;

public class PathCheckHandler {
    public Optional<Map<CommandParamType, List<File>>> checker(String pathString) {
        File file = new File(pathString);

        if (!file.exists()) {
            System.out.println("does not exist");
            return Optional.empty();
        }

        if (file.isDirectory()) {
            List<File> imgList = findimgLstRecursively(file);
            if (imgList.isEmpty()) {
                System.out.println("not any picture");
                return Optional.empty();

            }
            System.out.println("found picture file");
            return Optional.of(createResultMap(CommandParamType.FolderPathParam, imgList));
        }

        if (file.isFile() && isImageFile(file)) {
            System.out.println("This is a picture file: " + file.getAbsolutePath());
            return Optional.of(createResultMap(CommandParamType.FilePathParam, List.of(file)));
        }

        System.out.println("not picture file or not a directory");
        return Optional.empty();
    }

    public Map<CommandParamType, List<File>> createResultMap(CommandParamType key, List<File> files) {
        Map<CommandParamType, List<File>> result = new HashMap<>();
        result.put(key, files);
        return result;
    }

    public boolean isImageFile(File file) {
        String fileName = file.getName().toLowerCase();
        String dot = ".";

        boolean flag = fileName.endsWith(dot + FileExtension.JPG_LOWER)
                || fileName.endsWith(dot + FileExtension.JPEG_LOWER)
                || fileName.endsWith(dot + FileExtension.GIF_LOWER) || fileName.endsWith(dot + FileExtension.PNG_LOWER)
                || fileName.endsWith(dot + FileExtension.WEBP_LOWER);
        return flag;
    }

    public List<File> findimgLstRecursively(File directory) {
        // 获取指定目录下的所有文件和子目录
        File[] files = directory.listFiles();

        // 如果目录为空或不存在，则返回一个空的文件列表
        if (files == null) {
            return new ArrayList<>(); // 返回空列表
        }

        // 使用 Stream API 来过滤出所有是文件且为图片类型的文件
        List<File> imgLst = Arrays.stream(files)
                .filter(file -> file.isFile() && isImageFile(file)) // 过滤条件：必须是文件且为图片类型
                .collect(Collectors.toList()); // 收集过滤后的文件到列表中

        // 使用 Stream API 来遍历所有子目录
        Arrays.stream(files)
                .filter(file -> file.isDirectory()) // 过滤条件：必须是目录
                .forEach(subDir -> imgLst.addAll(findimgLstRecursively(subDir))); // 递归地查找子目录中的图片文件，并添加到 imgLst 列表中

        // 返回最终收集到的所有图片文件列表
        return imgLst;
    }

}